package jmine.tec.security.ldap.connector;

import org.springframework.ldap.core.AttributesMapper;

/**
 * Fornece os filtros de consulta específicos. Encapsula o esquema da árvore LDAP.
 * 
 * @date 13 de setembro de 2010
 * @author seiti
 */
public class LdapConnector {

    private static final String USERNAME = "#{username}";

    private String userFilter;

    private String userBaseDN;

    private String groupFilter;

    private String groupNameAttribute;

    private String groupBaseDN;

    private AttributesMapper groupMapper;

    private AttributesMapper userMapper;

    /**
     * @return valor do campo userBaseDN.
     */
    public String getUserBaseDN() {
        return this.userBaseDN;
    }

    /**
     * Define valor para campo userBaseDN.
     * 
     * @param userBaseDN valor para campo userBaseDN.
     */
    public void setUserBaseDN(String userBaseDN) {
        this.userBaseDN = userBaseDN;
    }

    /**
     * @return valor do campo groupBaseDN.
     */
    public String getGroupBaseDN() {
        return this.groupBaseDN;
    }

    /**
     * Define valor para campo groupBaseDN.
     * 
     * @param groupBaseDN valor para campo groupBaseDN.
     */
    public void setGroupBaseDN(String groupBaseDN) {
        this.groupBaseDN = groupBaseDN;
    }

    /**
     * @return valor do campo userFilter.
     */
    public String getUserFilter() {
        return this.userFilter;
    }

    /**
     * Define valor para campo userFilter.
     * 
     * @param userFilter valor para campo userFilter.
     */
    public void setUserFilter(String userFilter) {
        this.userFilter = userFilter;
    }

    /**
     * @return valor do campo groupFilter.
     */
    public String getGroupFilter() {
        return this.groupFilter;
    }

    /**
     * Define valor para campo groupFilter.
     * 
     * @param groupFilter valor para campo groupFilter.
     */
    public void setGroupFilter(String groupFilter) {
        this.groupFilter = groupFilter;
    }

    /**
     * @return o atributo que define onde se encontra o nome do grupo
     */
    @Deprecated
    public String getGroupNameAttribute() {
        return this.groupNameAttribute;
    }

    /**
     * @param groupNameAttribute groupNameAttribute
     */
    @Deprecated
    public void setGroupNameAttribute(String groupNameAttribute) {
        this.groupNameAttribute = groupNameAttribute;
    }

    /**
     * @param groupMapper the groupMapper
     */
    public void setGroupMapper(AttributesMapper groupMapper) {
        this.groupMapper = groupMapper;
    }

    /**
     * Filtra os atributos dos grupos encontrados. Deve devolver uma lista de Strings.
     * 
     * @return o groupMapper
     */
    public AttributesMapper getGroupMapper() {
        if (this.groupMapper == null) {
            return new GroupMapper(this.getGroupNameAttribute());
        }
        return this.groupMapper;
    }

    /**
     * @param userMapper the userMapper
     */
    public void setUserMapper(AttributesMapper userMapper) {
        this.userMapper = userMapper;
    }

    /**
     * Filtra os atributos dos usuários encontrados. Deve devolver uma lista de Strings.
     * 
     * @return getUserMapper
     */
    public AttributesMapper getUserMapper() {
        if (this.groupMapper == null) {
            return new UserMapper();
        }
        return this.userMapper;
    }

    /**
     * Filtro para trazer o usuário especificado
     * 
     * @param username o nome do usuário.
     * @return o filtro de usuários.
     */
    public String getUserFilter(String username) {
        return this.userFilter.replace(USERNAME, username);
    }

    /**
     * Filtro para trazer os grupos do usuário especificado
     * 
     * @param username o nome do usuário
     * @return o filtro de grupos.
     */
    public String getGroupsFilter(String username) {
        return this.groupFilter.replace(USERNAME, username);
    }
}
